﻿using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Protocal.App.Common.Models;

namespace Protocal.App.Common
{
    public class TaskQueueHelper
    {
        private static ConcurrentQueue<TaskModel> AsyncModels = new ConcurrentQueue<TaskModel>();
        private static AutoResetEvent ResetEvent = new AutoResetEvent(false);

        static TaskQueueHelper()
        {
            Task.Run(async () =>
            {
                Debug.WriteLine("异步队列开始执行");
                while (true)
                {
                    if (AsyncModels.TryDequeue(out TaskModel taskModel))
                    {
#pragma warning disable CS4014 // 由于此调用不会等待，因此在调用完成前将继续执行当前方法
                        Task.Delay(taskModel.DelayTime).ContinueWith(t => 
                        {
                            try
                            {
                                taskModel.Action?.Invoke();
                            }
                            catch (Exception ex)
                            {
                                // 可以记录日志或者回调通知
                                throw new Exception(ex.Message);
                            }
                        });
#pragma warning restore CS4014 // 由于此调用不会等待，因此在调用完成前将继续执行当前方法
                    }
                    else
                    {
                        ResetEvent.WaitOne(); // 等待新任务
                    }
                }
            });
        }

        public static void AddModel(TaskModel model)
        {
            AsyncModels.Enqueue(model);
            ResetEvent.Set(); // 通知处理线程有新任务
        }
    }

}
